#%%
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets.samples_generator import make_blobs
from sklearn.neighbors import KNeighborsClassifier
#%% 根据指定的中心点随机生成100个点
centers = [[-2, 2], [2, 2], [0, 4]]
# 这里y是从0开始的类别值
X, y = make_blobs(n_samples=100, centers=centers, random_state=0, cluster_std=0.60)

#%% 画出训练数据集
plt.figure(figsize=(6, 4), dpi=144)
c = np.array(centers)
plt.scatter(X[:, 0], X[:, 1], c=y, s=100, cmap='cool');         # 画出样本
plt.scatter(c[:, 0], c[:, 1], s=100, marker='^', c='orange');   # 画出中心点
plt.show()
#%% 模型训练
clf = KNeighborsClassifier() # 使用默认的k值5
clf.fit(X,y)
#%% 模型预测
X_predict = np.array([[3,6]])
y_predict = clf.predict(X_predict)
print('预测结果：',y_predict)

# 获取距离最近的点
neighbors = clf.kneighbors(X_predict, return_distance=False)
print(neighbors)
#%% 从图示看结果
plt.figure(figsize=(6, 4), dpi=144)
plt.scatter(X[:, 0], X[:, 1], c=y, s=100, cmap='cool');    # 样本
plt.scatter(c[:, 0], c[:, 1], s=100, marker='^', c='k');   # 中心点
plt.scatter(X_predict[:,0], X_predict[:,1], marker="x", 
            c=y_predict, s=100, cmap='cool')    # 待预测的点

for i in neighbors[0]:
    plt.plot([X[i][0], X_predict[:,0]], [X[i][1], X_predict[:,1]], 
             'k--', linewidth=0.6);    # 预测点与距离最近的 5 个样本的连线
plt.show()